﻿Imports PTIC_Util
Imports PTIC_Util.GestionCalculs

Namespace Comptes

    ''' <summary>
    ''' Représente le compte technique Vie
    ''' </summary>
    ''' <remarks></remarks>
    Public Class CompteTechniqueVie_V2
        Inherits CalculCompose
        Private _parametresEntree As Parametres
        Private _hasPMdc As Boolean

#Region "Construccteur"
        ''' <summary>
        ''' Constructeur
        ''' </summary>
        ''' <param name="hasPMdc"></param>
        ''' <remarks></remarks>
        Public Sub New(ByVal hasPMdc As Boolean)
            MyBase.New()
            _hasPMdc = hasPMdc
            _resultats = New ResultatsCRTVie
        End Sub
#End Region

#Region "Has PM décès"
        ''' <summary>
        ''' 
        ''' </summary>
        ''' <remarks></remarks>
        Friend Property hasPMdc() As Boolean
            Get
                Return _hasPMdc
            End Get
            Set(ByVal value As Boolean)
                _hasPMdc = value
            End Set
        End Property
#End Region

#Region "Paramètres en entrée"
        ''' <summary>
        ''' Données initiales utilisées pour faire les calculs
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Property ParametresEntree() As Parametres
            Get
                Return _parametresEntree
            End Get
            Friend Set(ByVal value As Parametres)
                _parametresEntree = value
            End Set
        End Property

        ''' <summary>
        ''' Parametre utilisé pour évaluer les comptes techniques vie
        ''' </summary>
        ''' <remarks></remarks>
        Public Class Parametres

            ''' <summary>
            ''' Représente le nombre d'années de projection
            ''' </summary>
            ''' <remarks></remarks>
            Public Property NbAnneesProjetees As Integer

            ''' <summary>
            ''' Prix de la garantie PTIA en % du décès
            ''' </summary>
            ''' <remarks></remarks>
            Public Property PrixGarantiePTIA As Double

            ''' <summary>
            ''' Taux de rendement annuel des actifs
            ''' </summary>
            ''' <remarks></remarks>
            Public Property Tx_rendActifs_Ann As Double

            ''' <summary>
            ''' Frais de gestion annuels
            ''' </summary>
            ''' <remarks></remarks>
            Public Property Fg As Double

            ''' <summary>
            ''' Cout annuel  des emprunts subordonnés à durée indéterminés
            ''' </summary>
            ''' <remarks></remarks>
            Public Property Cout_annTSDI As Double

            ''' <summary>
            ''' Taux technique annuel
            ''' </summary>
            ''' <remarks></remarks>
            Public Property Tx_TechAnn As Double

            ''' <summary>
            ''' Taux de couverture des emprunts subordonnés à durée indéterminés
            ''' </summary>
            ''' <remarks></remarks>
            Public Property Tx_CouvTSDI As Double

            ''' <summary>
            ''' Commission apporteur
            ''' </summary>
            ''' <remarks></remarks>
            Public Property ComApporteur As Double

            ''' <summary>
            ''' Primes DC
            ''' </summary>
            ''' <remarks></remarks>
            Public Property PrimesDC As Double()

            ''' <summary>
            ''' 
            ''' </summary>
            ''' <remarks></remarks>
            Public Property SinRegles As Double()

            ''' <summary>
            ''' 
            ''' </summary>
            ''' <remarks></remarks>
            Public Property PmDCclotTheo As Double()

            ''' <summary>
            ''' 
            ''' </summary>
            ''' <remarks></remarks>
            Public Property CapiAllouesVie As Double()
        End Class
#End Region

#Region "Résultats"
        ''' <summary>
        ''' Résultats des calculs
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Overloads ReadOnly Property Resultats() As ResultatsCRTVie
            Get
                Return _resultats
            End Get
        End Property

        ''' <summary>
        ''' Résultat de l'évaluation des comptes techniques Vie
        ''' </summary>
        ''' <remarks></remarks>
        Public Class ResultatsCRTVie

            ''' <summary>
            ''' Représente les primes décès
            ''' </summary>
            ''' <remarks></remarks>
            Public Property PrimesDC As Double()

            ''' <summary>
            ''' Représente le montant des sinistres réglés
            ''' </summary>
            ''' <remarks></remarks>
            Public Property SinRegles As Double()

            ''' <summary>
            ''' Représente les primes décès qui ne sont pas encore couvert
            ''' </summary>
            ''' <remarks></remarks>
            Public Property PmDCouv As Double()

            ''' <summary>
            ''' Représente les primes décès qui ne sont pas cloturés
            ''' </summary>
            ''' <remarks></remarks>
            Public Property PmDCclot As Double()

            ''' <summary>
            ''' Représente le produit des placements
            ''' </summary>
            ''' <remarks></remarks>
            Public Property ProduitPlacements As Double()

            ''' <summary>
            ''' Frais de gestion annuels
            ''' </summary>
            ''' <remarks></remarks>
            Public Property Fg As Double()

            ''' <summary>
            ''' Représente les charges générés par les placements
            ''' </summary>
            ''' <remarks></remarks>
            Public Property ChargePlacements As Double()

            ''' <summary>
            ''' Représente le produit des placements qui sont transférés
            ''' </summary>
            ''' <remarks></remarks>
            Public Property ProduitPlacementsTransferes As Double()

            ''' <summary>
            ''' Représente la commission versé à l'apporteur d'affaire
            ''' </summary>
            ''' <remarks></remarks>
            Public Property ComApporteur As Double()

            ''' <summary>
            ''' Représente le résultat vie
            ''' </summary>
            ''' <remarks></remarks>
            Public Property ResultatVie As Double()

            ''' <summary>
            ''' Fait une copie des données
            ''' </summary>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Function Copy() As ResultatsCRTVie
                Dim result As New ResultatsCRTVie
                Dim primesDC_copy(PrimesDC.Count - 1) As Double
                Dim sinRegles_copy(SinRegles.Count - 1) As Double
                Dim PmDCouv_copy(PmDCouv.Count - 1) As Double
                Dim PmDCclot_copy(PmDCclot.Count - 1) As Double
                Dim produitPlacements_copy(ProduitPlacements.Count - 1) As Double
                Dim FG_copy(FG.Count - 1) As Double
                Dim chargePlacements_copy(ChargePlacements.Count - 1) As Double
                Dim produitPlacementsTransferes_copy(ProduitPlacementsTransferes.Count - 1) As Double
                Dim comApporteur_copy(ComApporteur.Count - 1) As Double
                Dim resultatVie_copy(ResultatVie.Count - 1) As Double
                For i = 0 To PrimesDC.Count - 1
                    primesDC_copy(i) = PrimesDC(i)
                    sinRegles_copy(i) = SinRegles(i)
                    PmDCouv_copy(i) = PmDCouv(i)
                    PmDCclot_copy(i) = PmDCclot(i)
                    produitPlacements_copy(i) = ProduitPlacements(i)
                    FG_copy(i) = FG(i)
                    chargePlacements_copy(i) = ChargePlacements(i)
                    produitPlacementsTransferes_copy(i) = ProduitPlacementsTransferes(i)
                    comApporteur_copy(i) = ComApporteur(i)
                    resultatVie_copy(i) = ResultatVie(i)
                Next
                result.PrimesDC = primesDC_copy
                result.SinRegles = sinRegles_copy
                result.PmDCouv = PmDCouv_copy
                result.PmDCclot = PmDCclot_copy
                result.ProduitPlacements = produitPlacements_copy
                result.FG = FG_copy
                result.ChargePlacements = chargePlacements_copy
                result.ProduitPlacementsTransferes = produitPlacementsTransferes_copy
                result.ComApporteur = comApporteur_copy
                result.ResultatVie = resultatVie_copy
                Return result
            End Function

        End Class
#End Region

#Region "Procédure de calcul"
        ''' <summary>
        ''' Fonction de calcul
        ''' </summary>
        ''' <remarks></remarks>
        Protected Overrides Sub procedureCalcul()

            Dim resultatCalcul As New ResultatsCRTVie

            With ParametresEntree

                'Création des tableaux attendus en sortie du compte
                ReDim resultatCalcul.PrimesDC(.nbAnneesProjetees - 1)
                ReDim resultatCalcul.SinRegles(.nbAnneesProjetees - 1)
                ReDim resultatCalcul.PmDCouv(.nbAnneesProjetees - 1)
                ReDim resultatCalcul.PmDCclot(.nbAnneesProjetees - 1)
                ReDim resultatCalcul.ProduitPlacements(.nbAnneesProjetees - 1)
                ReDim resultatCalcul.FG(.nbAnneesProjetees - 1)
                ReDim resultatCalcul.ChargePlacements(.nbAnneesProjetees - 1)
                ReDim resultatCalcul.ProduitPlacementsTransferes(.nbAnneesProjetees - 1)
                ReDim resultatCalcul.ComApporteur(.nbAnneesProjetees - 1)
                ReDim resultatCalcul.ResultatVie(.nbAnneesProjetees - 1)

                For i = 1 To .nbAnneesProjetees

                    If i <= .primesDC.Count Then

                        resultatCalcul.PrimesDC(i - 1) = .primesDC(i - 1)
                        resultatCalcul.SinRegles(i - 1) = .sinRegles(i - 1) * (1 + .prixGarantiePTIA)

                        'PM DC clôture
                        resultatCalcul.PmDCclot(i - 1) = IIf(_hasPMdc, Math.Max(.pmDCclotTheo(i - 1), 0), 0)

                        'PM DC ouverture et clôture
                        If i = 1 Then
                            resultatCalcul.PmDCouv(i - 1) = 0
                        Else
                            resultatCalcul.PmDCouv(i - 1) = resultatCalcul.PmDCclot(i - 2)
                        End If

                        'Produit des placements
                        resultatCalcul.ProduitPlacements(i - 1) = (.capiAllouesVie(i - 1) _
                                                   + ((resultatCalcul.PmDCouv(i - 1) + resultatCalcul.PmDCclot(i - 1)) / 2)) * .tx_rendActifs_Ann
                        'Frais de gestion
                        resultatCalcul.FG(i - 1) = .primesDC(i - 1) * .fg
                        'Charge des placements
                        resultatCalcul.ChargePlacements(i - 1) = (.capiAllouesVie(i - 1) * .tx_CouvTSDI) * _
                                                  (.cout_annTSDI + .tx_rendActifs_Ann)
                        'Produit des placements transférés
                        resultatCalcul.ProduitPlacementsTransferes(i - 1) = (resultatCalcul.ProduitPlacements(i - 1) - _
                                                         ((resultatCalcul.PmDCouv(i - 1) + resultatCalcul.PmDCclot(i - 1)) / 2) * .tx_TechAnn - _
                                                         resultatCalcul.ChargePlacements(i - 1))
                        'Commission apporteur
                        resultatCalcul.ComApporteur(i - 1) = ParametresEntree.comApporteur * ParametresEntree.primesDC(i - 1)
                        'Résultat vie
                        resultatCalcul.ResultatVie(i - 1) = ParametresEntree.primesDC(i - 1) _
                                               + resultatCalcul.PmDCouv(i - 1) _
                                               + resultatCalcul.ProduitPlacements(i - 1) _
                                               - resultatCalcul.SinRegles(i - 1) _
                                               - resultatCalcul.PmDCclot(i - 1) _
                                               - resultatCalcul.FG(i - 1) _
                                               - resultatCalcul.ChargePlacements(i - 1) _
                                               - resultatCalcul.ProduitPlacementsTransferes(i - 1) _
                                               - resultatCalcul.ComApporteur(i - 1)

                    Else
                        resultatCalcul.PrimesDC(i - 1) = 0
                        resultatCalcul.SinRegles(i - 1) = 0
                        'PM DC ouverture et clôture
                        resultatCalcul.PmDCouv(i - 1) = 0
                        'Produit des placements
                        resultatCalcul.ProduitPlacements(i - 1) = 0
                        'Frais de gestion
                        resultatCalcul.FG(i - 1) = 0
                        'Charge des placements
                        resultatCalcul.ChargePlacements(i - 1) = 0
                        'Produit des placements transférés
                        resultatCalcul.ProduitPlacementsTransferes(i - 1) = 0
                        'Commission apporteur
                        resultatCalcul.ComApporteur(i - 1) = 0
                        'Résultat vie
                        resultatCalcul.ResultatVie(i - 1) = 0
                    End If
                Next

            End With

            _resultats = resultatCalcul
        End Sub
#End Region

    End Class

End Namespace